#ifndef SESSIONMANAGER_H
#define SESSIONMANAGER_H

#include <QObject>
#include <QMap>
#include <QList>
#include <QTimerEvent>
#include "session.h"
#include "common.h"

// 前向声明
class PacketCapturer;

// 会话管理器类，用于跟踪和管理应用层协议会话
class SessionManager : public QObject
{
    Q_OBJECT

public:
    explicit SessionManager(QObject *parent = nullptr);
    ~SessionManager();
    
    // 处理捕获的数据包，尝试将会话相关的数据包分组
    void processPacket(const PacketInfo &packet);
    
    // 获取所有会话
    QList<ProtocolSession> getAllSessions() const;
    
    // 根据ID获取会话
    ProtocolSession *getSessionById(const QString &sessionId);
    
    // 根据数据包索引获取相关会话
    QList<ProtocolSession *> getSessionsByPacketIndex(int packetIndex);
    
    // 获取指定类型的会话
    QList<ProtocolSession *> getSessionsByType(SessionType type);
    
    // 清除所有会话
    void clearAllSessions();
    
    // 获取会话总数
    int getSessionCount() const;
    
    // 开始会话超时检查
    void startSessionTimeoutCheck(int intervalMs = 5000);
    
    // 停止会话超时检查
    void stopSessionTimeoutCheck();
    
    // 设置会话超时时间
    void setSessionTimeout(int timeoutMs);

signals:
    // 当检测到新会话时触发
    void newSessionDetected(const ProtocolSession &session);
    
    // 当会话状态更新时触发
    void sessionUpdated(const ProtocolSession &session);
    
    // 当会话完成时触发
    void sessionCompleted(const ProtocolSession &session);

protected:
    // 处理定时器事件
    void timerEvent(QTimerEvent *event) override;
    
private slots:
    // 检查会话超时
    void checkSessionTimeouts();

private:
    // 存储所有会话，键为会话ID
    QMap<QString, ProtocolSession> m_sessions;
    
    // 会话超时时间（毫秒）
    int m_sessionTimeoutMs;
    
    // 会话超时检查定时器ID
    int m_timeoutTimerId;
    
    // 从数据包信息中提取应用层协议类型
    SessionType identifyApplicationProtocol(const PacketInfo &packet);
    
    // 为数据包创建或更新会话
    QString createOrUpdateSession(const PacketInfo &packet, SessionType type);
    
    // 检查数据包是否属于指定会话
    bool isSameSession(const PacketInfo &packet, const ProtocolSession &session);
    
    // 解析HTTP协议，提取请求和响应信息
    void parseHTTP(const PacketInfo &packet, ProtocolSession &session);
    
    // 解析DNS协议，提取查询和响应信息
    void parseDNS(const PacketInfo &packet, ProtocolSession &session);
    
    // 解析FTP协议，提取命令和响应信息
    void parseFTP(const PacketInfo &packet, ProtocolSession &session);
    
    // 从传输层详情中提取端口信息
    bool extractPorts(const PacketInfo &packet, int &srcPort, int &dstPort);
};

#endif // SESSIONMANAGER_H